package com.huahua.api.service.entertainment.impl;

import com.huahua.api.entity.dto.DmxApiContent;
import com.huahua.api.entity.dto.DmxApiMessageV2;
import com.huahua.api.entity.dto.DmxApiRequestV2;
import com.huahua.api.entity.entertainment.param.NameAnalysisParam;
import com.huahua.api.exception.CommonException;
import com.huahua.api.service.DmxApiService;
import com.huahua.api.service.entertainment.NameAnalysisService;
import com.huahua.api.util.CheckUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.time.Year;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 姓名分析服务实现
 *
 * @author Huahua-Ai
 * @date 2025-08-25 15:32:00
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class NameAnalysisServiceImpl implements NameAnalysisService {

    private final DmxApiService dmxApiService;

    /**
     * 针对DeepSeek优化的姓名分析提示词
     */
    private static final String NAME_ANALYSIS_PROMPT = """
            ## 角色定位
            你是一位资深的姓名学研究专家，精通中华文化、姓名学、易经八卦、五行理论和心理学。你将通过分析用户提供的姓名信息，提供深度的人设画像分析。
            
            ## 分析框架
            请按照以下结构化框架进行分析：
            
            ### 1. 姓名音韵学分析
            - 分析姓名的声调组合（平仄搭配）
            - 评估音韵的和谐度与流畅性
            - 解读音韵所传达的性格暗示
            
            ### 2. 字形结构解析
            - 分析汉字的笔画数理
            - 解读字形结构的寓意
            - 评估姓名的视觉平衡感
            
            ### 3. 文化内涵挖掘
            - 探索姓名中的文化典故
            - 分析名字的时代特征
            - 解读家族期望与价值观
            
            ### 4. 五行属性分析
            - 根据字形字义判断五行属性
            - 分析五行的平衡与互补关系
            - 提供五行调和建议
            
            ### 5. 综合人设画像
            基于以上分析，构建立体的人物画像：
            - **外在形象**：给人的第一印象
            - **性格特质**：核心性格特征（3-5个关键词）
            - **潜在优势**：天赋才能与发展潜力
            - **社交风格**：人际交往模式
            - **事业倾向**：适合的发展方向
            
            ### 6. 听起来像什么样的人
            用生动形象的比喻和描述，让人物形象跃然纸上。例如：
            - 如果是颜色，会是什么颜色？
            - 如果是季节，会是哪个季节？
            - 如果是一种植物，会是什么？
            - 在人群中的辨识度如何？
            
            ### 7. 人生发展建议
            - **需要注意的点**（3-5条具体建议）
            - **性格优化方向**
            - **人际关系经营要点**
            - **事业发展策略**
            
            ## 输出要求
            1. 使用 Markdown 格式，层次清晰
            2. 语言风格：专业但不晦涩，温暖而富有洞察力
            3. 每个分析点都要有具体的解释和依据
            4. 避免使用绝对化的判断，多用"倾向于"、"可能"等词
            5. 在分析中融入积极正面的引导
            6. 结尾添加一句富有哲理的寄语
            
            ## 重要提醒
            - 姓名分析仅供参考，人的发展受多种因素影响
            - 重在启发思考，而非宿命论
            - 每个人都有改变和成长的可能
            """;

    @Override
    public Flux<String> analyzeName(NameAnalysisParam param) {
        // 参数校验
        CheckUtil.checkStrNotBlank(param.getName(), new CommonException("姓名不能为空"));
        CheckUtil.checkStrNotBlank(param.getGender(), new CommonException("性别不能为空"));
        CheckUtil.checkTrue("男".equals(param.getGender()) ||
                        "女".equals(param.getGender()) ||
                        "不想说".equals(param.getGender()),
                new CommonException("性别必须是：男、女或不想说"));

        // 如果提供了出生年份，进行校验
        if (param.getBirthYear() != null) {
            int currentYear = Year.now().getValue();
            CheckUtil.checkTrue(param.getBirthYear() >= 1900 && param.getBirthYear() <= currentYear,
                    new CommonException("出生年份必须在1900年到当前年份之间"));
        }

        // 构建用户输入信息
        StringBuilder userInput = new StringBuilder();
        userInput.append("请为我分析以下信息：\n");
        userInput.append("姓名：").append(param.getName()).append("\n");
        userInput.append("性别：").append(param.getGender()).append("\n");

        if (param.getBirthYear() != null) {
            userInput.append("出生年份：").append(param.getBirthYear()).append("年\n");
            int age = Year.now().getValue() - param.getBirthYear();
            userInput.append("（当前年龄约").append(age).append("岁）\n");
        }

        userInput.append("\n请根据以上信息，按照你的分析框架，为我生成详细的姓名分析报告。");

        // 构建系统消息
        List<DmxApiContent> systemContent = Collections.singletonList(
                DmxApiContent.builder()
                        .type("text")
                        .text(NAME_ANALYSIS_PROMPT)
                        .build()
        );

        // 构建用户消息
        List<DmxApiContent> userContent = Collections.singletonList(
                DmxApiContent.builder()
                        .type("text")
                        .text(userInput.toString())
                        .build()
        );

        // 构建API请求 - 使用deepseek模型
        DmxApiRequestV2 request = DmxApiRequestV2.builder()
                .model("DMXAPI-HuoShan-DeepSeek-V3")  // 使用DeepSeek模型
                .stream(true)
                .user("DMXAPI")
                .messages(Arrays.asList(
                        DmxApiMessageV2.builder()
                                .role("system")
                                .content(systemContent)
                                .build(),
                        DmxApiMessageV2.builder()
                                .role("user")
                                .content(userContent)
                                .build()
                ))
                .build();

        return dmxApiService.chatCompletions(request)
                .doOnError(e -> log.error("调用姓名分析API失败", e))
                .doOnComplete(() -> log.info("姓名分析完成 - 姓名: {}, 性别: {}",
                        param.getName(), param.getGender()));
    }
}
